<!DOCTYPE html>
<html lang="en">
  <head>
  <meta charset="utf-8" />
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0">
  <meta content="" name="keywords">

  <title> Django - </title>
  <meta name="description" content="" />
  <meta property="og:title" content="Django" />
  <meta name="twitter:title" content="Django" />
  <meta name="author" content="{Description { .Site.Author.name }}"/>
  <meta name="twitter:card" content="summary" />
  <meta property="og:url" content="https://systemime.github.io/categories/django/" />
  <meta property="og:type" content="website" />
  <meta property="og:site_name" content="听风的小站" />

  <meta name="generator" content="Hugo 0.67.0" />
  <link rel="canonical" href="https://systemime.github.io/categories/django/" />
  <link rel="alternate" href="https://systemime.github.io/index.xml" type="application/rss+xml" title="听风的小站">
  <script src="https://res.cloudinary.com/jimmysong/raw/upload/rootsongjc-hugo/jquery-1.12.4.min.js"></script>
  <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.7.1/katex.min.css" integrity="sha384-wITovz90syo1dJWVh32uuETPVEtGigN07tkttEqPv+uR2SE/mbQcG7ATL28aI9H0" crossorigin="anonymous">
  <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css" />
  <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">
  
  
  <link rel="stylesheet" href="https://systemime.github.io/css/main.css" />
  <link rel="stylesheet" href="https://systemime.github.io/css/my.css" />
  <link rel="stylesheet" href="https://systemime.github.io/css/pace.css" />
  <link rel="stylesheet" href="https://cdn.plyr.io/3.4.7/plyr.css">
  <link rel="stylesheet" href="https://systemime.github.io/css/lightgallery.css" />
  <link rel="stylesheet" href="https://systemime.github.io/css/baguetteBox.css" />
  <link rel="stylesheet" href="https://systemime.github.io/css/search.css" />
  <link rel="stylesheet" href="https://systemime.github.io/css/reward.css" />
  <link rel="stylesheet" href="https://systemime.github.io/css/share.min.css" />
  <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Lora:400,700,400italic,700italic" />
  <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Open+Sans:300italic,400italic,600italic,700italic,800italic,400,300,600,700,800" />
  <link rel="stylesheet" href="https://systemime.github.io/css/pygment_highlights.css" />
  <link rel="stylesheet" href="https://systemime.github.io/css/highlight.min.css" />
  <link rel="stylesheet" href="https://systemime.github.io/css/toc.css" />
  <link rel="stylesheet" href="https://systemime.github.io/css/lightbox.css" />
  <link rel="stylesheet" href="https://systemime.github.io/live2d/css/live2d.css" />
  
  <link href="https://systemime.github.io/css/video-js.css" rel="stylesheet">


<meta name="baidu-site-verification" content="g8IYR9SNLF" />
<script>
var _hmt = _hmt || [];
(function() {
  var hm = document.createElement("script");
  hm.src = "https://hm.baidu.com/hm.js?cffe439e37449bb1c07ab26ab56484bb";
  var s = document.getElementsByTagName("script")[0]; 
  s.parentNode.insertBefore(hm, s);
})();
</script>

<link rel="stylesheet" href="https://systemime.github.io/css/prism.css" />









<script src="https://systemime.github.io/js/pace.min.js" data-no-instant></script>



<script src="https://systemime.github.io/js/instantclick.min.js" data-no-instant></script>
   <script data-no-instant>
   InstantClick.on('change', function(isInitialLoad) {
     if (isInitialLoad === false) {
       if (typeof MathJax !== 'undefined') 
         MathJax.Hub.Queue(["Typeset",MathJax.Hub]);
       if (typeof prettyPrint !== 'undefined') 
         prettyPrint();
       if (typeof _hmt !== 'undefined')  
         _hmt.push(['_trackPageview', location.pathname + location.search]);
       if (typeof ga !== 'undefined')  
           ga('send', 'pageview', location.pathname + location.search);
     }
   });
   InstantClick.init();
</script>




<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/gist-embed/2.7.1/gist-embed.min.js"></script>


<script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
<script>
  (adsbygoogle = window.adsbygoogle || []).push({
    google_ad_client: "ca-pub-3925981084585036",
    enable_page_level_ads: true
  });
</script>



<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/photoswipe/4.1.1/photoswipe.min.css" integrity="sha256-sCl5PUOGMLfFYctzDW3MtRib0ctyUvI9Qsmq2wXOeBY=" crossorigin="anonymous" />
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/photoswipe/4.1.1/default-skin/default-skin.min.css" integrity="sha256-BFeI1V+Vh1Rk37wswuOYn5lsTcaU96hGaI7OUVCLjPc=" crossorigin="anonymous" />



<div class="pswp" tabindex="-1" role="dialog" aria-hidden="true">

<div class="pswp__bg"></div>

<div class="pswp__scroll-wrap">
    
    <div class="pswp__container">
      <div class="pswp__item"></div>
      <div class="pswp__item"></div>
      <div class="pswp__item"></div>
    </div>
    
    <div class="pswp__ui pswp__ui--hidden">
    <div class="pswp__top-bar">
      
      <div class="pswp__counter"></div>
      <button class="pswp__button pswp__button--close" title="Close (Esc)"></button>
      <button class="pswp__button pswp__button--share" title="Share"></button>
      <button class="pswp__button pswp__button--fs" title="Toggle fullscreen"></button>
      <button class="pswp__button pswp__button--zoom" title="Zoom in/out"></button>
      
      
      <div class="pswp__preloader">
        <div class="pswp__preloader__icn">
          <div class="pswp__preloader__cut">
            <div class="pswp__preloader__donut"></div>
          </div>
        </div>
      </div>
    </div>
    <div class="pswp__share-modal pswp__share-modal--hidden pswp__single-tap">
      <div class="pswp__share-tooltip"></div>
    </div>
    <button class="pswp__button pswp__button--arrow--left" title="Previous (arrow left)">
    </button>
    <button class="pswp__button pswp__button--arrow--right" title="Next (arrow right)">
    </button>
    <div class="pswp__caption">
      <div class="pswp__caption__center"></div>
    </div>
    </div>
    </div>
</div>

</head>

  <body>
    <nav class="navbar navbar-default navbar-fixed-top navbar-custom">
  <div class="container-fluid">
    <div class="navbar-header">
      <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#main-navbar">
        <span class="sr-only">Toggle navigation</span>
        <span class="icon-bar"></span>
        <span class="icon-bar"></span>
        <span class="icon-bar"></span>
      </button>
      <a class="navbar-brand" href="https://systemime.github.io">听风的小站</a>
    </div>
    <div class="collapse navbar-collapse" id="main-navbar">
      <ul class="nav navbar-nav navbar-right">
        
          
            <li>
		    <a title="博客" href="https://systemime.github.io/blog/">博客</a>
              
              
            </li>
          
        
          
            <li>
		    <a title="片刻" href="https://systemime.github.io/moment/">片刻</a>
              
              
            </li>
          
        
          
            <li>
		    <a title="关于" href="https://systemime.github.io/about/">关于</a>
              
              
            </li>
          
        
          
            <li>
		    <a title="留言" href="https://systemime.github.io/message/">留言</a>
              
              
            </li>
          
        

        

        
        
      </ul>
    </div>

    <div class="avatar-container">
      <div class="avatar-img-border">
        
      </div>
    </div>

  </div>
</nav>






    
  <header class="header-section ">
    <div class="intro-header no-img">
      <div class="container">
        <div class="row">
          <div class="col-lg-12 col-md-12 col-md-offset-0">
            <div class="page-heading">
              <h1>#Django</h1>
              <hr class="small">
            </div>
          </div>
        </div>
      </div>
    </div>
  </header>

    
  <div class="container" role="main">
    <div class="row">
      <div class="col-lg-8 col-lg-offset-2 col-md-10 col-md-offset-1">
        
        <div class="posts-list">
          
            <article class="post-preview">
              <a href="https://systemime.github.io/blog/2019-08/%E5%9F%BA%E4%BA%8Enginx%E9%83%A8%E7%BD%B2django/">
                <h2 class="post-title">基于Nginx部署Django</h2>

                
              </a>

              <p class="post-meta">
                Posted on August 15, 2019
              </p>
              <div class="post-entry">
                
                  <h2 id="一部署原理">一、部署原理</h2>
<p>Django的部署可以有很多方式，采用nginx+uwsgi的方式是其中比较常见的一种方式。</p>
<p>在这种方式中，我们的通常做法是，将nginx作为服务器最前端，它将接收WEB的所有请求，统一管理请求。</p>
<p>nginx把所有静态请求自己来处理（这是NGINX的强项）。然后，NGINX将所有非静态请求通过uwsgi传递给Django，由Django来进行处理，从而完成一次WEB请求。</p>
<p>可见，uwsgi的作用就类似一个桥接器。起到桥梁的作用。</p>
<h2 id="二nginx安装">二、Nginx安装</h2>
<p><code>Nginx</code>是一款轻量级的Web服务器/反向代理服务器及电子邮件（IMAP/POP3）代理服务器，并在一个BSD-like 协议下发行。其特点是占有内存少，并发能力强，事实上nginx的并发能力确实在同类型的网页服务器中表现较好。</p>
<p>Nginx同样为当前非常流行的web服务器。利用其部署Django，我们在此也做简单的介绍。</p>
<p>Nginx官网：<a href="http://nginx.org/">http://nginx.org/</a></p>
<ul>
<li>在终端下安装<strong>nginx</strong></li>
</ul>
<pre><code>apt-get install nginx
</code></pre><ul>
<li>启动<strong>nginx</strong></li>
</ul>
<pre><code>/etc/init.d/nginx start  #启动
/etc/init.d/nginx stop  #关闭
/etc/init.d/nginx restart  #重启
# 或
systemctl start/stop/restart nginx
</code></pre><ul>
<li>修改Nginx默认端口号，打开 <code>/etc/nginx/nginx.conf</code> 文件，修改端口号。</li>
</ul>
<pre><code># 这里我的端口号为9000，默认为80
# server_name修改为0.0.0.0

    server {
        listen       9000 default_server;
        listen       [::]:80 default_server;
        server_name  0.0.0.0;
        root         /usr/share/nginx/html;

        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;

        location / {
            include uwsgi_params;
            uwsgi_pass 127.0.0.1:8000;
            uwsgi_read_timeout 5;
        }

        location /static {
            expires 30d;
            autoindex on;
            add_header Cache-Control private;
            alias /opt/bloe/mbl/liuyanban2/static/;
        }

        error_page 404 /404.html;
            location = /40x.html {
        }

        error_page 500 502 503 504 /50x.html;
            location = /50x.html {
        }
    }
</code></pre><ul>
<li>
<p>重启nginx
重启nginx，访问<a href="http://%E5%A4%96%E7%BD%91IP:9000">http://外网IP:9000</a></p>
<p>比如像下面这样<br>
<img src="" alt="实例"></p>
<p>出现上图说明启动成功</p>
</li>
</ul>
<h2 id="三安装uwsgi">三、安装uwsgi</h2>
<ul>
<li>pip安装uwsgi</li>
</ul>
<pre><code>pip install uwsgi
</code></pre><ul>
<li>
<p>配置django与uwsgi连接，假设项目位置为：<code>/home/fnngj/pydj/myweb</code></p>
<pre><code>uwsgi --http :8001 --chdir /opt/bloe/mbl/liuyanban2/ --wsgi-file liuyanban2/wsgi.py --master --processes 4 --threads 2 --stats 0.0.0.0:60013
</code></pre><pre><code>
 最后的`0.0.0.0:60013` 表示外网，端口号自定义

</code></pre></li>
<li>
<p><strong>常用选项</strong></p>
<ul>
<li>
<p><code>http</code>： 协议类型和端口号</p>
</li>
<li>
<p><code>processes</code>： 开启的进程数量</p>
</li>
<li>
<p><code>workers</code>： 开启的进程数量，等同于processes（官网的说法是spawn the specified number ofworkers / processes）</p>
</li>
<li>
<p><code>chdir</code>： 指定运行目录（chdir to specified directory before apps loading）</p>
</li>
<li>
<p><code>wsgi-file</code>： 载入wsgi-file（load .wsgi file）</p>
</li>
<li>
<p><code>stats</code>： 在指定的地址上，开启状态服务（enable the stats server on the specified address）</p>
</li>
<li>
<p><code>threads</code>： 运行线程。由于GIL的存在，我觉得这个真心没啥用。（run each worker in prethreaded mode with the specified number of threads）</p>
</li>
<li>
<p><code>master</code>： 允许主进程存在（enable master process）</p>
</li>
<li>
<p><code>daemonize</code>： 使进程在后台运行，并将日志打到指定的日志文件或者udp服务器（daemonize uWSGI）。实际上最常用的，还是把运行记录输出到一个本地文件上。</p>
</li>
<li>
<p><code>pidfile</code>： 指定pid文件的位置，记录主进程的pid号。</p>
</li>
<li>
<p><code>vacuum</code>： 当服务器退出的时候自动清理环境，删除unix socket文件和pid文件（try to remove all of the generated file/sockets）</p>
</li>
</ul>
</li>
</ul>
<h2 id="四nginxuwsgidjango">四、Nginx+uwsgi+Django</h2>
<h4 id="1-配置wsgi">1. 配置wsgi</h4>
<p>工程项目文件目录树如下</p>
<pre><code>myweb/

├── manage.py

├── myweb/

│   ├── __init__.py

│   ├── settings.py

│   ├── urls.py

│   └── wsgi.py

└── myweb_uwsgi.ini
</code></pre><p>在我们通过Django创建myweb项目时，在子目录myweb下已经帮我们生成的 <code>wsgi.py</code>文件。</p>
<p>所以，我们只需要再创建<code>myweb_uwsgi.ini</code>配置文件即可，当然，uwsgi支持多种类型的配置文件，如xml，ini等。此处，使用ini类型的配置。</p>
<p><strong>注意，myweb是项目名</strong></p>
<pre><code># myweb_uwsgi.ini file
[uwsgi]

# Django-related settings

socket = :8000

# the base directory (full path)
# 项目位置
chdir           = /opt/bloe/mbl/liuyanban2

# Django s wsgi file
module          = liuyanban2.wsgi

# process-related settings
# master
master          = true

# maximum number of worker processes
processes       = 4

# ... with appropriate permissions - may be needed
# chmod-socket    = 664
# clear environment on exit
vacuum          = true
</code></pre><ul>
<li>
<p>socket  指定项目执行的端口号。</p>
</li>
<li>
<p>chdir   指定项目的目录。</p>
</li>
<li>
<p>module  myweb.wsgi ，可以这么来理解，对于myweb_uwsgi.ini文件来说，与它的平级的有一个myweb目录，这个目录下有一个wsgi.py文件。</p>
</li>
</ul>
<h4 id="2-测试uwsgi">2. 测试uwsgi</h4>
<p>接下来，切换到myweb项目目录下，通过uwsgi命令读取myweb_uwsgi.ini文件启动项目</p>
<pre><code>user@ubuntu:~$ cd /home/fnngj/pydj/myweb/
user@ubuntu:~/pydj/myweb$ uwsgi --ini myweb_uwsgi.ini 
[uWSGI] getting INI configuration from myweb_uwsgi.ini
*** Starting uWSGI 2.0.12 (32bit) on [Sat Mar 12 13:05:06 2016] ***
compiled with version: 4.8.4 on 26 January 2016 06:14:41
os: Linux-3.19.0-25-generic #26~14.04.1-Ubuntu SMP Fri Jul 24 21:18:00 UTC 2015
nodename: ubuntu
machine: i686
clock source: unix
detected number of CPU cores: 2
current working directory: /home/fnngj/pydj/myweb
detected binary path: /usr/local/bin/uwsgi
!!! no internal routing support, rebuild with pcre support !!!
chdir() to /home/fnngj/pydj/myweb
your processes number limit is 15962
your memory page size is 4096 bytes
detected max file descriptor number: 1024
lock engine: pthread robust mutexes
thunder lock: disabled (you can enable it with --thunder-lock)
uwsgi socket 0 bound to TCP address :8000 fd 3
Python version: 3.4.3 (default, Oct 14 2015, 20:37:06)  [GCC 4.8.4]
*** Python threads support is disabled. You can enable it with --enable-threads ***
Python main interpreter initialized at 0x8b52dc0
your server socket listen backlog is limited to 100 connections
your mercy for graceful operations on workers is 60 seconds
mapped 319920 bytes (312 KB) for 4 cores
*** Operational MODE: preforking ***
WSGI app 0 (mountpoint='') ready in 1 seconds on interpreter 0x8b52dc0 pid: 7158 (default app)
*** uWSGI is running in multiple interpreter mode ***
spawned uWSGI master process (pid: 7158)
spawned uWSGI worker 1 (pid: 7160, cores: 1)
spawned uWSGI worker 2 (pid: 7161, cores: 1)
spawned uWSGI worker 3 (pid: 7162, cores: 1)
spawned uWSGI worker 4 (pid: 7163, cores: 1)
</code></pre><h4 id="3-配置nginx">3. 配置nginx</h4>
<p>修改nginx.conf配置文件。打开/etc/nginx/nginx.conf文件，添加如下内容。</p>
<pre><code>server {
        listen       9000 default_server;
        listen       [::]:80 default_server;
        server_name  0.0.0.0;
        root         /usr/share/nginx/html;

        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;

        location / {
            include uwsgi_params;
            uwsgi_pass 127.0.0.1:8000;
            uwsgi_read_timeout 5;
        }

        location /static {
            expires 30d;
            autoindex on;
            add_header Cache-Control private;
            alias /opt/bloe/mbl/liuyanban2/static/;
        }

        error_page 404 /404.html;
            location = /40x.html {
        }

        error_page 500 502 503 504 /50x.html;
            location = /50x.html {
        }
    }

</code></pre><p>实际前面几步中已经添加了</p>
<ul>
<li>
<p><code>listen</code> 指定的是nginx代理uwsgi对外的端口号。</p>
</li>
<li>
<p><code>server_name</code>  网上大多资料都是设置的一个网址（例，www.example.com），我这里如果设置成网址无法访问，所以，指定的到了本机默认ip，当然可以0.0.0.0，外网访问</p>
</li>
<li>
<p><code>include</code> 必须指定为<strong>uwsgi_params</strong>；而<code>uwsgi_pass</code>指的本机IP的端口号与<strong>myweb_uwsgi.ini</strong>配置中的文件中的必须一致。</p>
</li>
</ul>
<h4 id="4-测试nginx">4. 测试nginx</h4>
<p>现在重新启动nginx，翻看上面重启动nginx的命令。然后，访问：<a href="http://%E5%A4%96%E7%BD%91IP:9000/">http://外网IP:9000/</a></p>
<p>通过这个IP和端口号的指向，请求应该是先到nginx的。如果你在页面上执行一些请求，就会看到，这些请求最终会转到uwsgi来处理。</p>
<h2 id="五结束">五、结束</h2>

                
              </div>

              
                <span class="post-meta">
                  
                    #<a href="https://systemime.github.iotags/django/">Django</a>&nbsp;
                  
                    #<a href="https://systemime.github.iotags/nginx/">Nginx</a>&nbsp;
                  
                    #<a href="https://systemime.github.iotags/uwsgi/">uwsgi</a>&nbsp;
                  
                    #<a href="https://systemime.github.iotags/%E9%83%A8%E7%BD%B2/">部署</a>&nbsp;
                  
                </span>
              

            </article>
          
            <article class="post-preview">
              <a href="https://systemime.github.io/blog/2019-08/django%E8%A7%A3%E5%86%B3%E8%B7%A8%E5%9F%9F%E9%97%AE%E9%A2%98/">
                <h2 class="post-title">Django解决跨域问题</h2>

                
              </a>

              <p class="post-meta">
                Posted on August 5, 2019
              </p>
              <div class="post-entry">
                
                  <h2 id="一错误提示">一、错误提示</h2>
<pre><code>No 'Access-Control-Allow-Origin' header is present on the requested resource.
</code></pre><h3 id="什么是cors">什么是CORS</h3>
<p>上面的问题就是由<code>CORS</code>引起的，什么是CORS?<br>
CORS（跨域资源共享，Cross-Origin Resource Sharing）是一种跨域访问的机制，可以让Ajax实现跨域访问。<br>
其实，在服务器的response header中，加入 &quot; Access-Control-Allow-Origin: *&rdquo; 即可支持CORS</p>
<h2 id="二跨域方案">二、跨域方案</h2>
<h3 id="1使用jsonp">1、使用JSONP</h3>
<p>使用Ajax获取json数据时，存在跨域的限制。</p>
<p>不过，在Web页面上调用js的script脚本文件时却不受跨域的影响，JSONP就是利用这个来实现跨域的传输。</p>
<p>因此，我们需要将Ajax调用中的dataType从JSON改为JSONP（相应的API也需要支持JSONP）格式。</p>
<p><strong>JSONP只能用于GET请求。</strong></p>
<h3 id="2直接修改django中的viewspy文件">2、直接修改Django中的views.py文件</h3>
<p>修改views.py中对应API的实现函数，允许其他域通过Ajax请求数据：
<div class="highlight"><pre class="chroma"><code class="language-python" data-lang="python"><span class="k">def</span> <span class="nf">myview</span><span class="p">(</span><span class="n">_request</span><span class="p">):</span>
  <span class="n">response</span> <span class="o">=</span> <span class="n">HttpResponse</span><span class="p">(</span><span class="n">json</span><span class="o">.</span><span class="n">dumps</span><span class="p">({</span><span class="s2">&#34;key&#34;</span><span class="p">:</span> <span class="s2">&#34;value&#34;</span><span class="p">,</span> <span class="s2">&#34;key2&#34;</span><span class="p">:</span> <span class="s2">&#34;value&#34;</span><span class="p">}))</span>
  <span class="n">response</span><span class="p">[</span><span class="s2">&#34;Access-Control-Allow-Origin&#34;</span><span class="p">]</span> <span class="o">=</span> <span class="s2">&#34;*&#34;</span>
  <span class="n">response</span><span class="p">[</span><span class="s2">&#34;Access-Control-Allow-Methods&#34;</span><span class="p">]</span> <span class="o">=</span> <span class="s2">&#34;POST, GET, OPTIONS&#34;</span>
  <span class="n">response</span><span class="p">[</span><span class="s2">&#34;Access-Control-Max-Age&#34;</span><span class="p">]</span> <span class="o">=</span> <span class="s2">&#34;1000&#34;</span>
  <span class="n">response</span><span class="p">[</span><span class="s2">&#34;Access-Control-Allow-Headers&#34;</span><span class="p">]</span> <span class="o">=</span> <span class="s2">&#34;*&#34;</span>
  <span class="k">return</span> <span class="n">response</span></code></pre></div></p>
<h3 id="3安装django-cors-headers">3、安装django-cors-headers</h3>
<p>来自GitHub的库，<a href="https://github.com/ottoyiu/django-cors-headers/">django-cors-headers</a></p>
<p>用于处理跨源资源共享（CORS）所需的服务器头的Django应用程序</p>
<p>使用之前要注意一下使用范围：
* 支持Python 3.5-3.7
* Django 1.11-2.2支持</p>
<p>安装django-cors-headers：</p>
<pre><code>pip install django-cors-headers
</code></pre><p>必要的添加，在<code>setting.py</code>文件中</p>
<pre><code>INSTALLED_APPS = (
  ...
  'corsheaders',
  ...
)
 
...
 
MIDDLEWARE_CLASSES = (
  ...
  'corsheaders.middleware.CorsMiddleware',
  'django.middleware.common.CommonMiddleware',
  ...
)
</code></pre><p>分享一下个人的其他配置(如果有安全性考虑请不要照抄，尤其是第一行&hellip;.)，具体请看GitHub官方配置页</p>
<pre><code># 跨域设置
CORS_ORIGIN_ALLOW_ALL = True
CORS_ORIGIN_WHITELIST = []
CORS_ALLOW_METHODS = [
    ' DELETE ',
    ' GET ',
    ' OPTIONS ',
    ' PATCH ',
    ' POST ',
    ' PUT ',
]
CORS_ALLOW_HEADERS = [
    'accept',
    'accept-encoding',
    'authorization',
    'content-type',
    'dnt',
    'origin',
    'user-agent',
    'x-csrftoken',
    'x-requested-with',
]
CORS_ALLOW_CREDENTIALS = True

X_FRAME_OPTIONS = 'ALLOWALL'

SECURE_HSTS_SECONDS = 3600
</code></pre><h2 id="ajax提交的小教程">ajax提交的小教程</h2>
<p><a href="https://www.cnblogs.com/wj-1314/p/10539203.html">https://www.cnblogs.com/wj-1314/p/10539203.html</a></p>

                
              </div>

              
                <span class="post-meta">
                  
                    #<a href="https://systemime.github.iotags/django/">Django</a>&nbsp;
                  
                    #<a href="https://systemime.github.iotags/%E8%B7%A8%E5%9F%9F/">跨域</a>&nbsp;
                  
                </span>
              

            </article>
          
            <article class="post-preview">
              <a href="https://systemime.github.io/blog/2019-05/django%E5%B8%B8%E7%94%A8%E8%AF%AD%E6%B3%95/">
                <h2 class="post-title">Django——常用语法</h2>

                
              </a>

              <p class="post-meta">
                Posted on May 12, 2019
              </p>
              <div class="post-entry">
                
                  <h2 id="官方文档">官方文档</h2>
<p><a href="https://docs.djangoproject.com/zh-hans/2.2/ref/templates/builtins/">Django2.2</a></p>
<h2 id="常用语法">常用语法</h2>
<p>只需要记两种特殊符号：</p>
<pre><code>{{}} 和 {%%}

变量相关的用
{{}}

逻辑相关的用
{%%}
</code></pre><h3 id="变量">变量</h3>
<p>在Django的模板语言中按此语法使用：<code>{{ 变量名 }}</code>。</p>
<p>当模版引擎遇到一个变量，它将计算这个变量，然后用结果替换掉它本身。 变量的命名包括任何字母数字以及下划线 <code>_</code> 的组合。 变量名称中不能有空格或标点符号。</p>
<p>点 <code>.</code> 在模板语言中有特殊的含义。当模版系统遇到点 <code>.</code> ，它将以这样的顺序查询：</p>
<ul>
<li>字典查询（Dictionary lookup）</li>
<li>属性或方法查询（Attribute or method lookup）</li>
<li>数字索引查询（Numeric index lookup）</li>
</ul>
<p><strong>注意事项：</strong></p>
<ol>
<li>如果计算结果的值是可调用的，它将被无参数的调用。 调用的结果将成为模版的值。</li>
<li>如果使用的变量不存在， 模版系统将插入 <code>string_if_invalid</code> 选项的值， 它被默认设置为&rsquo;&rsquo; (空字符串) 。
几个例子：</li>
</ol>
<p>view中代码：</p>
<pre><code>def template_test(request):
    l = [11, 22, 33]
    d = {&quot;name&quot;: &quot;alex&quot;}

    class Person(object):
        def __init__(self, name, age):
            self.name = name
            self.age = age

        def dream(self):
            return &quot;{} is dream...&quot;.format(self.name)

    Alex = Person(name=&quot;Alex&quot;, age=34)
    Egon = Person(name=&quot;Egon&quot;, age=9000)
    Eva_J = Person(name=&quot;Eva_J&quot;, age=18)

    person_list = [Alex, Egon, Eva_J]
    return render(request, &quot;template_test.html&quot;, {&quot;l&quot;: l, &quot;d&quot;: d, &quot;person_list&quot;: person_list})
</code></pre><p>模板中支持的写法：</p>
<pre><code>{# 取l中的第一个参数 #}
{{ l.0 }}
{# 取字典中key的值 #}
{{ d.name }}
{# 取对象的name属性 #}
{{ person_list.0.name }}
{# .操作只能调用不带参数的方法 #}
{{ person_list.0.dream }}
</code></pre><h3 id="filters过滤器">Filters（过滤器）</h3>
<p>在Django的模板语言中，通过使用 <code>过滤器</code> 来改变变量的显示。</p>
<p>过滤器的语法：</p>
<pre><code>{{ value|filter_name:参数 }}
</code></pre><p>使用管道符 <code>|</code> 来应用过滤器。</p>
<p>例如：</p>
<pre><code>{{ name|lower }}

会将name变量应用lower过滤器之后再显示它的值。lower在这里的作用是将文本全都变成小写。
</code></pre><p><strong>注意事项：</strong></p>
<ol>
<li>过滤器支持“链式”操作。即一个过滤器的输出作为另一个过滤器的输入。</li>
<li>过滤器可以接受参数，例如：</li>
</ol>
<pre><code>{{ sss|truncatewords:30 }}
# 这将显示sss的前30个词。
</code></pre><ol start="3">
<li>过滤器参数包含空格的话，必须用引号包裹起来。比如使用逗号和空格去连接一个列表中的元素，如：</li>
</ol>
<pre><code>{{ list|join:', ' }}
</code></pre><ol start="4">
<li><code>|</code> 左右没有空格没有空格没有空格</li>
</ol>
<p><strong>Django的模板语言中提供了大约六十个内置过滤器。</strong></p>
<h4 id="default">default</h4>
<p><strong>如果一个变量是false或者为空，使用给定的默认值。 否则，使用变量的值。</strong></p>
<pre><code>{{ value|default:&quot;nothing&quot;}}
</code></pre><p>如果value没有传值或者值为空的话就显示nothing</p>
<h4 id="length">length</h4>
<p><strong>返回值的长度，作用于字符串和列表。</strong></p>
<pre><code>{{ value|length }}
</code></pre><p>返回value的长度，如 <code>value=['a', 'b', 'c', 'd']</code>的话，就显示4.</p>
<h4 id="filesizeformat">filesizeformat</h4>
<p>将值格式化为一个 “人类可读的” 文件尺寸 （例如 <code>13 KB</code>, <code>4.1 MB</code>, <code>102 bytes</code>, 等等）。例如：</p>
<pre><code>{{ value|filesizeformat }}
</code></pre><p>如果 value 是 123456789，输出将会是 117.7 MB。</p>
<h4 id="slice">slice</h4>
<p>切片</p>
<pre><code>{{value|slice:&quot;2:-1&quot;}}
</code></pre><p>与python中切片几乎无异议</p>
<h4 id="date">date</h4>
<p>格式化</p>
<pre><code>{{ value|date:&quot;Y-m-d H:i:s&quot;}}
</code></pre><p>可用的参数：</p>
<table>
<thead>
<tr>
<th align="center">格式化字符</th>
<th align="center">描述</th>
<th align="center">示例输出</th>
</tr>
</thead>
<tbody>
<tr>
<td align="center">a</td>
<td align="center"><code>a.m.</code>或<code>p.m.</code>（请注意，这与PHP的输出略有不同，因为这包括符合Associated Press风格的期间）</td>
<td align="center"><code>a.m.</code></td>
</tr>
<tr>
<td align="center">A</td>
<td align="center"><code>AM</code>或<code>PM</code></td>
<td align="center"><code>AM</code></td>
</tr>
<tr>
<td align="center">b</td>
<td align="center">月，文字，3个字母，小写</td>
<td align="center"><code>jan</code></td>
</tr>
<tr>
<td align="center">B</td>
<td align="center">未实现。</td>
<td align="center"></td>
</tr>
<tr>
<td align="center">c</td>
<td align="center">ISO 8601格式。 （注意：与其他格式化程序不同，例如“Z”，“O”或“r”，如果值为naive datetime，则“c”格式化程序不会添加时区偏移量（请参阅<code>[datetime.tzinfo](https://docs.python.org/3/library/datetime.html#datetime.tzinfo)</code>）</td>
<td align="center">2008-01-02T10:30:00.000123+02:00或2008-01-02T10:30:00.000123如果datetime是天真的</td>
</tr>
<tr>
<td align="center">d</td>
<td align="center">月的日子，带前导零的2位数字</td>
<td align="center"><code>01</code>到<code>31</code></td>
</tr>
<tr>
<td align="center">D</td>
<td align="center">一周中的文字，3个字母</td>
<td align="center"><code>“星期五”</code></td>
</tr>
<tr>
<td align="center">e</td>
<td align="center">时区名称 可能是任何格式，或者可能返回一个空字符串，具体取决于datetime</td>
<td align="center"><code>''</code>、<code>'GMT'</code>、<code>'-500'</code>、<code>'US/Eastern'</code>等</td>
</tr>
<tr>
<td align="center">E</td>
<td align="center">月份，特定地区的替代表示通常用于长日期表示</td>
<td align="center"><code>'listopada'</code>（对于波兰语区域，而不是<code>'Listopad'</code>）</td>
</tr>
<tr>
<td align="center">f</td>
<td align="center">时间，在12小时的小时和分钟内，如果它们为零，则分钟停留。专有扩展</td>
<td align="center"><code>'1'</code>，<code>'1:30'</code></td>
</tr>
<tr>
<td align="center">F</td>
<td align="center">月，文，长</td>
<td align="center"><code>'一月'</code></td>
</tr>
<tr>
<td align="center">g</td>
<td align="center">小时，12小时格式，无前导零</td>
<td align="center"><code>'1'</code>到<code>'12'</code></td>
</tr>
<tr>
<td align="center">G</td>
<td align="center">小时，24小时格式，无前导零</td>
<td align="center"><code>'0'</code>到<code>'23'</code></td>
</tr>
<tr>
<td align="center">h</td>
<td align="center">小时，12小时格式</td>
<td align="center"><code>'01'</code>到<code>'12'</code></td>
</tr>
<tr>
<td align="center">H</td>
<td align="center">小时，24小时格式</td>
<td align="center"><code>'00'</code>到<code>'23'</code></td>
</tr>
<tr>
<td align="center">i</td>
<td align="center">分钟</td>
<td align="center"><code>'00'</code>到<code>'59'</code></td>
</tr>
<tr>
<td align="center">I</td>
<td align="center">夏令时间，无论是否生效</td>
<td align="center"><code>'1'</code>或<code>'0'</code></td>
</tr>
<tr>
<td align="center">j</td>
<td align="center">没有前导零的月份的日子</td>
<td align="center"><code>'1'</code>到<code>'31'</code></td>
</tr>
<tr>
<td align="center">l</td>
<td align="center">星期几，文字长</td>
<td align="center"><code>'星期五'</code></td>
</tr>
<tr>
<td align="center">L</td>
<td align="center">布尔值是否是一个闰年</td>
<td align="center"><code>True</code>或<code>False</code></td>
</tr>
<tr>
<td align="center">m</td>
<td align="center">月，2位数字带前导零</td>
<td align="center"><code>'01'</code>到<code>'12'</code></td>
</tr>
<tr>
<td align="center">M</td>
<td align="center">月，文字，3个字母</td>
<td align="center"><code>“扬”</code></td>
</tr>
<tr>
<td align="center">n</td>
<td align="center">月无前导零</td>
<td align="center"><code>'1'</code>到<code>'12'</code></td>
</tr>
<tr>
<td align="center">N</td>
<td align="center">美联社风格的月份缩写。 专有扩展</td>
<td align="center"><code>'Jan.'</code>，<code>'Feb.'</code>，<code>'March'</code>，<code>'May'</code></td>
</tr>
<tr>
<td align="center">o</td>
<td align="center">ISO-8601周编号，对应于使用闰年的ISO-8601周数（W） 对于更常见的年份格式，请参见Y</td>
<td align="center"><code>'1999年'</code></td>
</tr>
<tr>
<td align="center">O</td>
<td align="center">与格林威治时间的差异在几小时内</td>
<td align="center"><code>'+0200'</code></td>
</tr>
<tr>
<td align="center">P</td>
<td align="center">时间为12小时，分钟和&rsquo;a.m。'/&lsquo;p.m。'，如果为零，分钟停留，特殊情况下的字符串“午夜”和“中午”。 专有扩展</td>
<td align="center"><code>'1 am'</code>，<code>'1:30 pm' / t3&gt;，'midnight'，'noon'，'12：30 pm' / T10&gt;</code></td>
</tr>
<tr>
<td align="center">r</td>
<td align="center">RFC 5322格式化日期</td>
<td align="center"><code>'Thu, 21 Dec 2000 16:01:07 +0200'</code></td>
</tr>
<tr>
<td align="center">s</td>
<td align="center">秒，带前导零的2位数字</td>
<td align="center"><code>'00'</code>到<code>'59'</code></td>
</tr>
<tr>
<td align="center">S</td>
<td align="center">一个月的英文序数后缀，2个字符</td>
<td align="center"><code>'st'</code>，<code>'nd'</code>，<code>'rd'</code>或<code>'th'</code></td>
</tr>
<tr>
<td align="center">t</td>
<td align="center">给定月份的天数</td>
<td align="center"><code>28</code> to <code>31</code></td>
</tr>
<tr>
<td align="center">T</td>
<td align="center">本机的时区</td>
<td align="center"><code>'EST'</code>，<code>'MDT'</code></td>
</tr>
<tr>
<td align="center">u</td>
<td align="center">微秒</td>
<td align="center"><code>000000</code> to <code>999999</code></td>
</tr>
<tr>
<td align="center">U</td>
<td align="center">自Unix Epoch以来的二分之一（1970年1月1日00:00:00 UTC）</td>
<td align="center"></td>
</tr>
<tr>
<td align="center">w</td>
<td align="center">星期几，数字无前导零</td>
<td align="center"><code>'0'</code>（星期日）至<code>'6'</code>（星期六）</td>
</tr>
<tr>
<td align="center">W</td>
<td align="center">ISO-8601周数，周数从星期一开始</td>
<td align="center"><code>1</code>，<code>53</code></td>
</tr>
<tr>
<td align="center">y</td>
<td align="center">年份，2位数字</td>
<td align="center"><code>'99'</code></td>
</tr>
<tr>
<td align="center">Y</td>
<td align="center">年，4位数</td>
<td align="center"><code>'1999年'</code></td>
</tr>
<tr>
<td align="center">z</td>
<td align="center">一年中的日子</td>
<td align="center"><code>0</code>到<code>365</code></td>
</tr>
<tr>
<td align="center">Z</td>
<td align="center">时区偏移量，单位为秒。 UTC以西时区的偏移量总是为负数，对于UTC以东时，它们总是为正</td>
<td align="center"><code>-43200</code>到<code>43200</code></td>
</tr>
</tbody>
</table>
<h4 id="safe">safe</h4>
<p>Django的模板中会对HTML标签和JS等语法标签进行自动转义，原因显而易见，这样是为了安全。但是有的时候我们可能不希望这些HTML元素被转义.
比如我们做一个内容管理系统，后台添加的文章中是经过修饰的，这些修饰可能是通过一个类似于FCKeditor编辑加注了HTML修饰符的文本，如果自动转义的话显示的就是保护HTML标签的源文件。
为了在Django中关闭HTML的自动转义有两种方式，如果是一个单独的变量我们可以通过过滤器<code>|safe</code>的方式告诉Django这段代码是安全的不必转义。</p>
<p>比如：</p>
<pre><code>value = &quot;&lt;a href='#'&gt;点我&lt;/a&gt;&quot;

{{ value|safe}}
</code></pre><h4 id="truncatechars">truncatechars</h4>
<p>如果字符串字符多于指定的字符数量，那么会被截断。截断的字符串将以可翻译的省略号序列（“&hellip;”）结尾。</p>
<p>参数：截断的字符数</p>
<pre><code>{{ value|truncatechars:9}}
</code></pre><h4 id="truncatewords">truncatewords</h4>
<p>在一定数量的字后截断字符串。</p>
<pre><code>{{ value|truncatewords:9}}
</code></pre><h4 id="cut">cut</h4>
<p>移除value中所有的与给出的变量相同的字符串</p>
<pre><code>{{ value|cut:' ' }}
</code></pre><p>如果value为<code>'i love you'</code>，那么将输出<code>'iloveyou'</code>.</p>
<h4 id="join">join</h4>
<p>使用字符串连接列表，例如Python的<code>str.join(list)</code></p>
<h4 id="timesince">timesince</h4>
<p><strong>将日期格式设为自该日期起的时间（例如，4天，6小时）</strong></p>
<p><strong>采用一个可选参数，它是一个包含用作比较点的日期的变量（不带参数，比较点为现在）。 例如，如果blog_date是表示2006年6月1日午夜的日期实例，并且comment_date是2006年6月1日08:00的日期实例，则以下将返回“8小时”：</strong></p>
<pre><code>{{ blog_date|timesince:comment_date }}
</code></pre><p>分钟是所使用的最小单位，对于相对于比较点的未来的任何日期，将返回“0分钟”。</p>
<h4 id="timeuntil">timeuntil</h4>
<p>似于timesince，除了它测量从现在开始直到给定日期或日期时间的时间。 例如，如果今天是2006年6月1日，而conference_date是保留2006年6月29日的日期实例，则</p>
<pre><code>{{ conference_date | timeuntil }}
</code></pre><p>将返回“4周”。</p>
<p>使用可选参数，它是一个包含用作比较点的日期（而不是现在）的变量。 如果from_date包含2006年6月22日，则以下内容将返回“1周”：</p>
<pre><code>{{ conference_date|timeuntil:from_date }}
</code></pre><h4 id="自定义filter">自定义filter</h4>
<p>自定义过滤器只是带有一个或两个参数的Python函数:</p>
<ul>
<li>变量（输入）的值 - -不一定是一个字符串</li>
<li>参数的值 - 这可以有一个默认值，或完全省略</li>
</ul>
<p>例如，在过滤器</p>
<pre><code>{{var | foo:'bar'}}
</code></pre><p>中，过滤器foo将传递变量<code>var</code>和参数<code>bar</code>。</p>
<p>自定义filter代码文件摆放位置：</p>
<pre><code>app01/
    __init__.py
    models.py
    templatetags/  # 在app01下面新建一个package package
        __init__.py
        app01_filters.py  # 建一个存放自定义filter的文件
    views.py
</code></pre><p>编写自定义filter</p>
<pre><code>from django import template
register = template.Library()

@register.filter(name=&quot;cut&quot;)
def cut(value, arg):
    return value.replace(arg, &quot;&quot;)

@register.filter(name=&quot;addSB&quot;)
def add_sb(value):
    return &quot;{} SB&quot;.format(value)
</code></pre><p>使用自定义filter</p>
<pre><code>{# 先导入我们自定义filter那个文件 #}
{% load app01_filters %}

{# 使用我们自定义的filter #}
{{ somevariable|cut:&quot;0&quot; }}
{{ d.name|addSB }}
</code></pre><h3 id="tags">Tags</h3>
<h4 id="for循环">for循环</h4>
<p><strong>普通for循环</strong></p>
<pre><code>&lt;ul&gt;
{% for user in user_list %}
    &lt;li&gt;{{ user.name }}&lt;/li&gt;
{% endfor %}
&lt;/ul&gt;
</code></pre><p>for循环可用的一些参数：</p>
<!-- raw HTML omitted -->
<p><strong>for &hellip; empty</strong></p>
<pre><code>&lt;ul&gt;
{% for user in user_list %}
    &lt;li&gt;{{ user.name }}&lt;/li&gt;
{% empty %}
    &lt;li&gt;空空如也&lt;/li&gt;
{% endfor %}
&lt;/ul&gt;
</code></pre><h4 id="if判断">if判断</h4>
<p><code>if,elif</code>和<code>else</code></p>
<pre><code>{% if user_list %}
  用户人数：{{ user_list|length }}
{% elif black_list %}
  黑名单数：{{ black_list|length }}
{% else %}
  没有用户
{% endif %}
</code></pre><p><strong>当然也可以只有if和else</strong></p>
<pre><code>{% if user_list|length &gt; 5 %}
  七座豪华SUV
{% else %}
    黄包车
{% endif %}
</code></pre><p><strong>if语句支持 and 、or、==、&gt;、&lt;、!=、&lt;=、&gt;=、in、not in、is、is not判断。</strong></p>
<h4 id="with">with</h4>
<p>定义一个中间变量，多用于给一个复杂的变量起别名。</p>
<p>注意等号左右不要加空格。</p>
<pre><code>{% with total=business.employees.count %}
    {{ total }} employee{{ total|pluralize }}
{% endwith %}

或

{% with business.employees.count as total %}
    {{ total }} employee{{ total|pluralize }}
{% endwith %}
</code></pre><h4 id="csrf_token">csrf_token</h4>
<p>这个标签用于跨站请求伪造保护。</p>
<p>在页面的form表单里面写上</p>
<pre><code>{% csrf_token %}
</code></pre><h4 id="注释">注释</h4>
<pre><code>{# ... #}
</code></pre><h4 id="注意事项">注意事项</h4>
<ol>
<li>Django的模板语言不支持连续判断，即不支持以下写法：</li>
</ol>
<pre><code>{% if a &gt; b &gt; c %}
...
{% endif %}
</code></pre><ol start="2">
<li>Django的模板语言中属性的优先级大于方法</li>
</ol>
<pre><code>def xx(request):
    d = {&quot;a&quot;: 1, &quot;b&quot;: 2, &quot;c&quot;: 3, &quot;items&quot;: &quot;100&quot;}
    return render(request, &quot;xx.html&quot;, {&quot;data&quot;: d})
</code></pre><p>如上，我们在使用render方法渲染一个页面的时候，传的字典d有一个key是items并且还有默认的 <code>d.items()</code> 方法，此时在模板语言中:</p>
<pre><code>{{ data.items }}
</code></pre><p>默认会取d的<code>items key</code>的值。</p>

                
              </div>

              
                <span class="post-meta">
                  
                    #<a href="https://systemime.github.iotags/django/">Django</a>&nbsp;
                  
                    #<a href="https://systemime.github.iotags/%E6%A8%A1%E6%9D%BF/">模板</a>&nbsp;
                  
                </span>
              

            </article>
          
            <article class="post-preview">
              <a href="https://systemime.github.io/blog/2019-05/django%E5%85%B3%E9%97%ADdegug%E5%BD%B1%E5%93%8Dcss%E6%A0%B7%E5%BC%8F%E5%8F%97%E5%BD%B1%E5%93%8D/">
                <h2 class="post-title">Django关闭DEGUG影响css样式受影响</h2>

                
              </a>

              <p class="post-meta">
                Posted on May 5, 2019
              </p>
              <div class="post-entry">
                
                  <h2 id="1如何关闭debug">1、如何关闭DEBUG</h2>
<p>在<code>setting.py</code>中修改如下配置</p>
<pre><code>```
# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = False

USE_TZ = False
```
</code></pre>
<h2 id="2恢复普通url链接样式">2、恢复普通url链接样式：</h2>
<ul>
<li>
<p>在<code>setting.py</code>中修改如下配置</p>
<pre><code>STATIC_URL = '/static/'
if DEBUG:
    STATICFILES_DIRS = [
        os.path.join(BASE_DIR, 'static'),
    ]
else:
    STATIC_ROOT = os.path.join(BASE_DIR, 'static')
</code></pre><pre><code>
</code></pre></li>
<li>
<p>在<code>urls.py</code>中，加入</p>
<pre><code>from django.conf.urls import url
from django.conf import settings
from django.views.static import serve
  
...
  
# 确保设置DEBUG为False时样式显示正常
if not settings.DEBUG:
    urlpatterns += [
        url(r'static/(?P&lt;path&gt;.*)$', serve,
            {'document_root': settings.STATIC_ROOT, 'show_indexes': settings.DEBUG})
    ]
</code></pre><pre><code>   
</code></pre></li>
</ul>
<h2 id="3恢复admin界面样式">3、恢复admin界面样式</h2>
<p><strong>上一步在<code>setting.py</code>、<code>urls.py</code>里修改的内容必须有</strong></p>
<p>运行命令, 把admin相关样式移动到自定义的样式文件夹中，比如<code>static</code></p>
<pre><code>python manage.py collectstatic
</code></pre><p>基本就可以了，如果还不行，加上这个</p>
<pre><code>url(r'^static/(?P&lt;path&gt;.*)$', 'django.views.static.serve',{'document_root': settings.STATIC_ROOT }),
</code></pre>
                
              </div>

              
                <span class="post-meta">
                  
                    #<a href="https://systemime.github.iotags/django/">Django</a>&nbsp;
                  
                    #<a href="https://systemime.github.iotags/%E6%A0%B7%E5%BC%8F/">样式</a>&nbsp;
                  
                    #<a href="https://systemime.github.iotags/debug/">DEBUG</a>&nbsp;
                  
                </span>
              

            </article>
          
        </div>
        
          <ul class="pager main-pager">
            
            
              <li class="next">
                <a href="https://systemime.github.io/categories/django/page/2">Older Posts &rarr;</a>
              </li>
            
          </ul>
        
      </div>
    <div align="center" class="col-lg-8 col-lg-offset-2 col-md-10 col-md-offset-1">
        

<ul class="pagination">
    
    <li class="page-item">
        <a href="https://systemime.github.io/categories/django/" class="page-link" aria-label="First"><span aria-hidden="true">&laquo;&laquo;</span></a>
    </li>
    
    <li class="page-item disabled">
    <a  class="page-link" aria-label="Previous"><span aria-hidden="true">&laquo;</span></a>
    </li>
    
    
    
    
    
    
    
        
        
    
    
    <li class="page-item active"><a class="page-link" href="https://systemime.github.io/categories/django/">1</a></li>
    
    
    
    
    
    
        
        
    
    
    <li class="page-item"><a class="page-link" href="https://systemime.github.io/categories/django/page/2/">2</a></li>
    
    
    
    
    
    
        
        
    
    
    <li class="page-item"><a class="page-link" href="https://systemime.github.io/categories/django/page/3/">3</a></li>
    
    
    <li class="page-item">
    <a href="https://systemime.github.io/categories/django/page/2/" class="page-link" aria-label="Next"><span aria-hidden="true">&raquo;</span></a>
    </li>
    
    <li class="page-item">
        <a href="https://systemime.github.io/categories/django/page/3/" class="page-link" aria-label="Last"><span aria-hidden="true">&raquo;&raquo;</span></a>
    </li>
    
</ul>


        
        
        
        
        
      </div>
    </div>
  </div>

    <div class="rocket"><img src="https://systemime.github.io/img/rocket_up.png" alt="" width="100" height="100"></div>
<script>
    $(function () {
      $(window).scroll(function () {
        
        if ($(window).scrollTop() >= 1000) {
          $('.rocket').stop().fadeIn(1000);
        }else {
          $('.rocket').stop().fadeOut(1000);
        }
      })
      
      $('.rocket').click(function () {
        $('html,body').stop().animate({scrollTop:0},400);
       
      })
    })

</script>

    
    <div id="landlord">
        <div class="message" style="opacity:0"></div>
        <canvas id="live2d" width="280" height="250" class="live2d"></canvas>
        <div class="hide-button">隐藏</div>
    </div>
    
    <footer id="copyright">
  <div class="container">
    <div class="row">
      <div class="col-lg-8 col-lg-offset-2 col-md-10 col-md-offset-1">
        <ul class="list-inline text-center footer-links">
          
          
        </ul>
        <p class="credits copyright text-muted">
        &copy;2017-2018
          
          &nbsp;&bull;&nbsp;
          September 20,2019
          updated
          
            &nbsp;&bull;&nbsp;
            <a href="https://systemime.github.io">Home</a>
          
        </p>

        <p class="credits theme-by text-muted">
        <a href="https://servicemesher.github.io" target="_blank">ServiceMesher</a>&nbsp;&bull;&nbsp;<a href="https://github.com/yangchuansheng/k8s-knowledge" target="_blank">Kubernetes 知识图谱</a>
        <br />
        <span id="busuanzi_container_site_pv">
            本站已被访问 <span id="busuanzi_value_site_pv"></span> 次啦
        </span>
        <span id="busuanzi_container_site_uv">
            &ensp;|&ensp;&thinsp;您是第 <span id="busuanzi_value_site_uv"></span> 位到访的小伙伴喔
        </span>
        </p>
        
        <p class="credits theme-by text-muted">
          <a href="http://gohugo.io">Hugo v0.67.0</a> powered &nbsp;&bull;&nbsp; Theme by <a href="http://deanattali.com/beautiful-jekyll/">Beautiful Jekyll</a> adapted to <a href="https://github.com/halogenica/beautifulhugo">Beautiful Hugo</a>
          
          <center><section class="credits theme-by text-muted">
    <span class="footer__copyright">
    <div>
    <span id="span_dt_dt"> </span>
    <script language="javascript">
      function show_date_time(){
        window.setTimeout("show_date_time()", 1000);
        BirthDay=new Date("7/8/2017 10:56:12");
        today=new Date();
        timeold=(today.getTime()-BirthDay.getTime());
        sectimeold=timeold/1000
        secondsold=Math.floor(sectimeold);
        msPerDay=24*60*60*1000
        e_daysold=timeold/msPerDay
        daysold=Math.floor(e_daysold);
        e_hrsold=(e_daysold-daysold)*24;
        hrsold=Math.floor(e_hrsold);
        e_minsold=(e_hrsold-hrsold)*60;
        minsold=Math.floor((e_hrsold-hrsold)*60);
        seconds=Math.floor((e_minsold-minsold)*60);
        span_dt_dt.innerHTML="本博客已经开心运行 "+daysold+" 天 "+hrsold+" 小时 "+minsold+" 分 "+seconds+" 秒";
      }
      show_date_time();
    </script>
    </div>
</script>
</section>
</center>
        </p>
      </div>
    </div>
  </div>
</footer>


<script src="https://res.cloudinary.com/jimmysong/raw/upload/rootsongjc-hugo/bootstrap.min.js"></script>
<script src="https://res.cloudinary.com/jimmysong/raw/upload/rootsongjc-hugo/photoswipe-ui-default.min.js"></script>
<script src="https://res.cloudinary.com/jimmysong/raw/upload/rootsongjc-hugo/photoswipe.min.js"></script>
<script src="https://res.cloudinary.com/jimmysong/raw/upload/rootsongjc-hugo/auto-render.min.js"></script>
<script src="https://systemime.github.io/js/main.js"></script>
<script src="https://systemime.github.io/js/clipboard.min.js"></script>
<script src="https://systemime.github.io/js/prism.js?t=123"></script>
<script src="https://systemime.github.io/js/highlight.min.js"></script>
<script src="https://res.cloudinary.com/jimmysong/raw/upload/rootsongjc-hugo/katex.min.js"></script>
<script src="https://systemime.github.io/js/reward.js"></script>
<script src="https://systemime.github.io/js/canvas_ribbon.js"></script>
<script> renderMathInElement(document.body); </script>

<script src="https://systemime.github.io/js/baguetteBox.js"></script>
<script> baguetteBox.run('.gallery');</script>






<script async defer src="https://buttons.github.io/buttons.js"></script>


<script src="https://polyfill.io/v2/polyfill.min.js?features=IntersectionObserver"></script>
<script type="text/javascript" src="https://systemime.github.io/js/quicklink.umd.js"></script>
<script>
window.addEventListener('load', () =>{
   quicklink();
});
</script>



<script type="text/javascript">
 
var a_idx = 0;
jQuery(document).ready(function($) {
    $("body").click(function(e) {
        var a = new Array("Docker", "Kubernetes", "Prometheus", "Envoy", "Istio", "Service Mesh", "Cloud Native");
        var $i = $("<span />").text(a[a_idx]);
        a_idx = (a_idx + 1) % a.length;
        var x = e.pageX,
        y = e.pageY;
        function randomColor() {
          var flakeColor = new Array("#FFDA65", "#00BFFF", "#BA55D3", "#FFA07A", "#87CEEB", "#FFB6C1");
          var snowColor = flakeColor[Math.floor(flakeColor.length * Math.random())];
          return snowColor;
        }
        $i.css({
            "z-index": 999999999999999999999999999999999999999999999999999999999999999999999,
            "top": y - 20,
            "left": x,
            "position": "absolute",
            "font-weight": "bold",
            "color": randomColor()
        });
        $("body").append($i);
        $i.animate({
            "top": y - 180,
            "opacity": 0
        },
        1500,
        function() {
            $i.remove();
        });
    });
});
</script>


<script type="text/javascript" src="https://systemime.github.io/js/lightbox.js"></script>











<script src="https://cdn.plyr.io/3.4.7/plyr.js"></script>
<script>const player = new Plyr('#player');</script>


<script async defer src="https://buttons.github.io/buttons.js"></script>


  </body>
</html>

